package com.chapter.sample.jvm.load;

import org.junit.Test;

import java.util.Random;

/**
 * 4、当使用java.lang.reflect包中的方法反射；比如：Class.forName("com.chapter.sample.jvm.load.Order");
 * 5、当初始化子类时，如果发现其父类还没有初始化，需要先触发父类的初始化
 * 6、如果一个接口定义了default方法，那么直接实现或者间接实现这个接口的类,做初始化时，这个接口要在这个类之前初始化
 * 7、当虚拟机启动时,用户需要指定一个要执行的主类(包含main方法的类)，虚拟机会先初始化这个类
 */
public class ActiveUse3 {
    static {
        System.out.println("ActiveUse3初始化");
    }

    @Test
    public void test1() {
        try {
            Class clazz = Class.forName("com.chapter.sample.jvm.load.Order");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test2() {
        System.out.println(Son.num);
    }

    @Test
    public void test3() {
        System.out.println(CompareC.NUM1);
    }

    public static void main(String[] args) {
        System.out.println("hello");
    }
}

class Father {
    static {
        System.out.println("Father类的初始化");
    }
}

class Son extends Father implements CompareB {
    static {
        System.out.println("Son类的初始过程");
    }

    public static int num = 1;
}

interface CompareB {
    public static final Thread t = new Thread() {
        {
            System.out.println("CompareB的初始化");
        }
    };

    public default void method1() {
        System.out.println("你好！");
    }
}

interface CompareC extends CompareB {
    public static final Thread t = new Thread() {
        {
            System.out.println("CompareC的初始化");
        }
    };

    public static final int NUM1 = new Random().nextInt(10);
}

